package pe.gob.essalud.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import pe.gob.essalud.model.Empresa;
import pe.gob.essalud.model.Persona;
import pe.gob.essalud.model.Usuario;
import pe.gob.essalud.service.EmpresaService;
import pe.gob.essalud.service.PersonaService;
import pe.gob.essalud.service.UsuarioService;
import pe.gob.essalud.util.CustomValidator;
import pe.gob.essalud.util.JsonUtil;

@PreAuthorize("hasAnyRole('ROLE_ADMIN')")
@Controller
public class MantenerUsuariosController {

	@Autowired
	private UsuarioService usuarioService;
	
	@Autowired
	private EmpresaService empresaService;
	
	@Autowired
	private PersonaService personaService;
	
	@Autowired
	private JsonUtil jsonUtil;
	
	@Autowired
	private CustomValidator customValidator;
	
	@RequestMapping(value = "/mantenerUsuarios", method = RequestMethod.GET)
	public String getMantenerUsuarios(Model model, Usuario usuario) {
		List<Usuario> listaUsuarios = usuarioService.buscarTodos();
		model.addAttribute("usuarios", listaUsuarios);
		model.addAttribute("opcionMenu","Usuarios");
		return "mantenerUsuarios";
	}
	
//	@RequestMapping(value = "/registrarUsuario", method = RequestMethod.GET)
//	public String getRegistrarUsuario(@ModelAttribute("usuario") Usuario usuario, Model model) {
//		model.addAttribute("modo", "registro");
//		model.addAttribute("opcionMenu","Usuarios");
//		return "registrarUsuario";
//	}
	
	@RequestMapping(value = "/getEmpresasJson", method = RequestMethod.GET, produces = "application/json; charset=utf-8")	 
	public @ResponseBody String getEmpresasJson() {
		List<Empresa> empresas = empresaService.buscarTodos();			
		return jsonUtil.armarJsonEmpresa(empresas);
	}
	
	@RequestMapping(value = "/getPersonasJson", method = RequestMethod.GET, produces = "application/json; charset=utf-8")	 
	public @ResponseBody String getPersonasJson() {
		List<Persona> personas = personaService.buscarTodos();			
		return jsonUtil.armarJsonPersona(personas);
	}
	
	@RequestMapping(value = "/registrarUsuario", method = RequestMethod.POST)
	public String postRegistrarUsuario(@ModelAttribute("usuario") @Valid Usuario usuario, BindingResult result, Model model, RedirectAttributes attr) {
		customValidator.validarLoginRepetido(result, usuario.getLogin(), null);
		if (result.hasErrors()) {
			attr.addFlashAttribute("errors", result.getAllErrors());
			attr.addFlashAttribute("errorNuevo", true);
			attr.addFlashAttribute("usuario", usuario);
		} else {
			usuarioService.registrarUsuario(usuario);
			attr.addFlashAttribute("mensajeNuevo", true);			
		}
		return "redirect:/mantenerUsuarios";
	}
	
	@RequestMapping(value = "/darBajaUsuario", method = RequestMethod.POST)
	public String darBajaUsuario(@RequestParam(value = "id") Integer id, Model model, RedirectAttributes attr) {
		usuarioService.darBajaUsuario(id);
		attr.addFlashAttribute("mensajeBaja", true);
		return "redirect:/mantenerUsuarios";
	}
	
//	@RequestMapping(value = "/editarUsuario", method = RequestMethod.GET)
//	public String getEditarUsuario(@RequestParam(value = "id") Integer id, Model model) {
//		Usuario usuario = usuarioService.buscarUsuario(id);
//		model.addAttribute("usuario", usuario);		
//		model.addAttribute("modo", "edicion");
//		model.addAttribute("opcionMenu","Usuarios");
//		return "registrarUsuario";
//	}
	
	@RequestMapping(value = "/editarUsuario", method = RequestMethod.POST)
	public String postEditarUsuario(@ModelAttribute("usuario") @Valid Usuario usuario, BindingResult result, Model model, RedirectAttributes attr) {
		customValidator.validarLoginRepetido(result, usuario.getLogin(), usuario.getId());
		if (result.hasErrors()) {
			attr.addFlashAttribute("errors", result.getAllErrors());
			attr.addFlashAttribute("errorEdicion", true);
			attr.addFlashAttribute("usuario", usuario);
		} else {
			usuarioService.editarUsuario(usuario);
			attr.addFlashAttribute("mensajeEdicion", true);			
		}	
		return "redirect:/mantenerUsuarios";
	}
	
	@RequestMapping(value = "/cambiarPasswordUsuario", method = RequestMethod.POST)
	public String cambiarPasswordUsuario(@RequestParam(value = "id") Integer id, @RequestParam(value = "password") String password, Model model, RedirectAttributes attr) {
		usuarioService.cambiarPasswordUsuario(id, password);
		attr.addFlashAttribute("mensajePassword", true);
		return "redirect:/mantenerUsuarios";
	}
	
}
